﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Systemet.Technical
{
    class UppföljningConnection
    {
        private LinqToSQLDataContext database;
        //private bool successfull = false;
        private string pass = AccessController.Instance.Connection;
        public void InsertKostnadsText(Uppföljning u)
        {
            try
            {

                database = new LinqToSQLDataContext(pass);
                //Kolla att varje rad på textfilen 
                var CheckUpp = (from Uppföljning in database.Uppföljningregisters
                                where u.Date.Month == Uppföljning.Datum.Month && u.ProdID == Uppföljning.produktID
                                select Uppföljning).Count();

                //Om Checkupp hittar värden på den månaden och på det produktID:et
                if (CheckUpp > 0)
                {
                    Uppföljningregister upp = database.Uppföljningregisters.Single(i => i.produktID == u.ProdID && i.Datum.Month == u.Date.Month);
                    {
                        int kost = 0;
                        if (u.Kostnadsbelopp != null)
                        {
                            kost = (int)u.Kostnadsbelopp;
                        }
                        if (upp.kostnad != null)
                        {
                            kost += (int)upp.kostnad;
                        }

                        upp.kostnad = (int)kost;
                    };
                    database.SubmitChanges();
                    database.Connection.Close();
                }
                //Skapa en ny post
                else
                {
                    Uppföljningregister up = new Uppföljningregister
                    {
                        produktID = u.ProdID,
                        produkt = u.ProduktNamn,
                        Datum = u.Date,
                        kostnad = (int)u.Kostnadsbelopp,
                        ändratDatum = DateTime.Now,
                        låst = u.Locked = true,
                    };
                    database.Uppföljningregisters.InsertOnSubmit(up);
                    database.SubmitChanges();
                    database.Connection.Close();
                }

            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                database.Connection.Close();
            }

        }
        public List<Prognos> ShowAllPrognoser(int month)
        {
            database = new LinqToSQLDataContext(pass);

            var Uppföljningar = from Prognos in database.UppföljningPrognos
                                join Produkt in database.Produktregisters on Prognos.produktID equals Produkt.produktID
                                where Prognos.Datum.Month == month && Prognos.låst == true
                                select Prognos;

            List<Prognos> prog = Uppföljningar.AsEnumerable()
                                 .Select(s => new Prognos
                                 {
                                     ProduktID = s.produktID,
                                     Produkt = s.Produktregister.produkt,
                                     Utfallmånad = s.UtfallMånad,
                                     prognos = s.prognossumma,
                                     Upparbetat = s.Upparbetat

                                 }).ToList();
            return prog.ToList();
        }


        //Tidigare prognoser
        public List<Prognos> RetrieveAllEarlierPrognoses(int month)
        {
            database = new LinqToSQLDataContext(pass);

            var prognoser = from UppföljningProgno in database.UppföljningPrognos
                            join Produkt in database.Produktregisters on UppföljningProgno.produktID equals Produkt.produktID
                            where UppföljningProgno.Datum.Month <= month
                            select UppföljningProgno;

            List<Prognos> prog = prognoser.AsEnumerable()
                                 .Select(s => new Prognos
                                 {
                                     ProduktID = s.produktID,
                                     Produkt = s.Produktregister.produkt,
                                     Budget = s.budget,
                                     Utfallmånad = s.UtfallMånad,
                                     Datum = s.Datum,
                                     Föregåendeprognos = s.FöregåendePrognos,
                                     Upparbetat = s.Upparbetat,
                                     prognos = s.prognossumma,
                                     Låst = (bool)s.låst


                                 }).ToList();
            return prog.ToList();
        }
        //Tidgare Kosnader
        public List<Uppföljning> RetriveAllEarlierUpp(int month)
        {
            database = new LinqToSQLDataContext(pass);

            var uppföljningar = from Uppföljning in database.Uppföljningregisters
                                where Uppföljning.Datum.Month <= month
                                select Uppföljning;
            List<Uppföljning> upp = uppföljningar.AsEnumerable()
                                    .Select(s => new Uppföljning
                                    {
                                        ProdID = s.produktID,
                                        Kostnadsbelopp = s.kostnad,
                                        Date = s.Datum
                                    }).ToList();
            return upp.ToList();
        }

        public List<Uppföljning> GetUppföljning(int månad)
        {
            database = new LinqToSQLDataContext(pass);
            var Uppföljningar = from Uppföljning in database.Uppföljningregisters
                                where Uppföljning.Datum.Month == månad
                                select Uppföljning;

            List<Uppföljning> upp = Uppföljningar.AsEnumerable()
                .Select(s => new Uppföljning
            {
                ProdID = s.produktID,
                Kostnadsbelopp = s.kostnad,

            }).ToList();
            return upp.ToList();
        }
        public List<string> RetrieveBudgetedYears()
        {

            database = new LinqToSQLDataContext(pass);
            List<string> allocatedYears = new List<string>();
            var query = from Prognos in database.UppföljningPrognos
                        where Prognos.avserÅr.Value.Year <= DateTime.Now.Year
                        group Prognos by Prognos.avserÅr into g
                        select new
                        {
                            AvserÅr = g.Key.Value.Year
                        };

            List<Prognos> budgetar = query.AsEnumerable()
            .Select(i => new Prognos
            {

                Budget = i.AvserÅr

            }).ToList();

            foreach (Prognos iB in budgetar)
            {
                allocatedYears.Add(iB.Budget.ToString());
            }
            return allocatedYears;
        }

        public int RetrieveBudgetedKostnadsMonths(int år)
        {

            database = new LinqToSQLDataContext(pass);
            List<int> allocatedMonths = new List<int>();
            var query = (from Uppföljning in database.Uppföljningregisters
                         where Uppföljning.Datum.Year == år
                         group Uppföljning by Uppföljning.Datum.Month into g
                         select new
                         {
                             Datum = g.Key
                         }).Count();

            int antalMån = query;


            return antalMån;
        }
        //Kollar om Uppföljning blivit låst på en viss månad
        public bool ValidateKostnaderLockedDown(int month)
        {
            if (month == 1)
            {
                month = 2;
            }

            database = new LinqToSQLDataContext(pass);

            var query = from Uppföljning in database.Uppföljningregisters
                        where Uppföljning.låst == false && Uppföljning.Datum.Month == month - 1
                        select Uppföljning;

            int antal = query.Count();

            if (antal > 0)
            {
                database.Connection.Close();
                return false;
            }
            else
            {
                database.Connection.Close();
                return true;
            }
        }
    }
}
